#ifndef _EASY_SHELL_H_
#define _EASY_SHELL_H_

#include "stdbool.h"
#include "stdint.h"
#include "string.h"
#include "stdio.h"

// <<< Use Configuration Wizard in Context Menu >>>

// <e>cmd brief 命令说明
#define ES_LOGO_ENABLE                 1
// </e>

// <o>Set maximum shell command cache size 命令行输入长度最大值
//  <i>Default: 16
//  <16=> 16 Bytes
//  <32=> 32 Bytes
//  <64=> 64 Bytes
//  <128=> 128 Bytes
#define ES_CMD_LENGTH_MAX              16

// <e>cmd brief 命令说明
#define ES_CMD_BRIEF_ENABLE            1
// </e>

// <e>TAB automatic completion 自动补全
#define ES_TAB_ENABLE                  1
// </e>

// <e>Cursor move 光标左右移动
#define ES_CURSOR_MOVE_ENABLE          1
// </e>

// <o>Set cmd num max 限制程序最大值
//  <i>Default: 8
//  <1-32>
#define ES_CMD_MAX                     8

// <o>Set cmd parameters max 程序参数最大值
//  <i>Default: 3
//  <0-8>
#define ES_CMD_PARA_MAX                3

// <<< end of configuration section >>>

#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 5000000)
#define ES_WEAK __attribute__((weak))
#elif defined(__IAR_SYSTEMS_ICC__)
#define ES_WEAK __weak
#elif defined(__MINGW32__)
#define ES_WEAK
#elif defined(__GNUC__)
#define ES_WEAK __attribute__((weak))
#endif

typedef int(*esLoopFunc_t)(int, char**);
typedef void (*esSendFunc_t)(uint8_t*,uint16_t);
typedef void (*esRecvFunc_t)(uint8_t);
typedef void (*esTickFunc_t)(uint8_t);

typedef struct{
    char *pName;
#if ES_CMD_BRIEF_ENABLE == 1
    char *pBrief;
#endif
    esLoopFunc_t pFunc;
}shellCmdTypedef;

typedef struct{
    esLoopFunc_t loopFunc;
    esSendFunc_t sendFunc;
    esRecvFunc_t recvFunc;
    esTickFunc_t tickFunc;
    bool isExit;
}esSysInfo_t;

extern esSysInfo_t esSysInfo;

extern int easyShellBootCmd(int argc, char** argv);

//必用基础函数
void easyShellInit(esSendFunc_t pUartSend);
void easyShellReceiveData(uint8_t dat);
bool easyShellAddCmd(shellCmdTypedef info);

//增强功能函数
void easyShellLoop(void);
void easyShellTick(uint8_t cycleMs);

#endif //_EASY_SHELL_H_
